/*
 * Copyright (c) 2003-2010, Live Media Pty. Ltd.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice, this list of
 *     conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice, this list of
 *     conditions and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *  3. Neither the name of Live Media nor the names of its contributors may be used to endorse
 *     or promote products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.colony.remote.rpc;

import com.argot.TypeException;
import com.argot.TypeLibrary;
import com.argot.TypeMap;
import com.argot.TypeMapperCore;
import com.argot.TypeMapperDynamic;
import com.argot.TypeMapperError;
import com.argot.network.TypeServer;
import com.argot.remote.MetaObject;
import com.colony.ColonyEnvironment;
import com.colony.IColonyServer;
import com.colony.remote.RemoteException;
import com.colony.transport.Server;

public class RpcServer
implements IColonyServer
{
	private boolean _isBound;
	private MetaObject _baseObject;
	private Server _transport;
	
	private ColonyEnvironment _environment;
	private TypeLibrary _library;
	private RpcDelegateFactory _delegateFactory;
	private TypeMap _dynamicTypeMap;
	private TypeServer _typeServer;
	
	public RpcServer( Server transport, MetaObject baseObject )
	{
		_isBound = false;
		_transport = transport;
		_baseObject = baseObject;
	}
	
	public RpcServer( Server transport )
	{
		this( transport, null);
	}
	
	public ColonyEnvironment getEnvironment()
	{
		return _environment;
	}

	public void bind( ColonyEnvironment environment ) 
	throws RemoteException, TypeException
	{
		if ( _isBound ) throw new RemoteException( "Client already bound" );
		_isBound = true;
		
		_environment = environment;
		_library = environment.getTypeLibrary();
		
		_dynamicTypeMap = new TypeMap( _library, new TypeMapperDynamic( new TypeMapperCore( new TypeMapperError() )) );
		_dynamicTypeMap.setReference(TypeMap.REFERENCE_MAP, _dynamicTypeMap);
		//TypeMapCore.mapMeta( _dynamicTypeMap , _library );
		//_dynamicTypeMap.map( 42, _library.getStreamId("dictionary.words"));
		
		_delegateFactory = new RpcDelegateFactory();
		RpcMetaServer rpcHost = new RpcMetaServer( _delegateFactory, _environment.getHostContainer(), _dynamicTypeMap);
		_typeServer = new TypeServer( _library, _dynamicTypeMap, rpcHost );	
		_transport.setTypeLink(_typeServer);
		if (_baseObject != null)
		{
			_typeServer.setBaseObject( _baseObject );
		}
	}

	public boolean isBound()
	{
		return _isBound;
	}
	
	public void setBaseObject( MetaObject baseObject )
	{	
		if ( isBound() )
		{
			_typeServer.setBaseObject( _baseObject );
		}
	}

}
